#include <stdio.h>
#include <stdarg.h> // 使用可变参数
#include <cstdlib>

using namespace std;

// 函数的声明必须在使用之前，可以不实现
// 函数两种传参方式：传值、传引用
void change(int i) {
    // 不会修改外部变量
    i = 10;
}

void change2(int *i) {
    // 修改指针指向地址的值，指针本身变量的值不修改
    *i = 10;
}

// 二级指针修改指针本身变量的值,即修改指针的指向
void change3(int **i) {
    int temp = 100;
    // *i即传递进来指针的值，重新指向temp的地址
    *i = &temp;
}

// 可变参数，要使用可变参数方法必须要有一个确定的参数
void fun1(int num, ...) {
    // va_list表示...的参数列表
    va_list list;
    // 开始获取可变参数
    va_start(list, num);

    // 先取出数字
    for (size_t i = 0; i < num; i++) {
        // 取出int类型的参数
        int argu = va_arg(list, int);
        printf("int argu %d\n", argu);
    }
    // 取出char类型
    char argu2 = va_arg(list, int);
    printf("char argu %c\n", argu2);
    // 释放列表
    va_end(list);
}

int main141() {
    int i = 1;
    //&i 获取i指针地址，&i_p获取i指针的变量的地址
    int *i_p = &i;
    change3(&i_p);


    printf("after change3 i=%d,i_p=%d\n", i, *i_p);   //1 100

    char c = 'a';
    fun1(3, 1, 2, 3, 'a');
    return 0;
}